package futbol.tacticas.concursantes2007.TacticaTururu;

import java.awt.Point;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.SituacionJugadores;

public class Defensa extends Jugador {

    private int cubreJugador = 20;
    private boolean estaCubriendo = false;

    // valores a evolucionar
    private int factorProximidad = 4;	// [ 1 .. 6] (x1)
    private int terminoProximidad = 15; 	// [ 0 .. 25 ] (x5)


	// ------------------------------------------- //
	//   S E T T E R S   D E L   G E N E T I C O   //
	// ------------------------------------------- //

    public void setFactorProximidad (int factorProximidad) {
        if (factorProximidad == 0) this.factorProximidad = 1;
        else this.factorProximidad = factorProximidad;
    }

    public void setTerminoProximidad(int terminoProximidad) {
		this.terminoProximidad = terminoProximidad;
	}

	// ----------------------------------------- //
	//   M E T O D O S   D E L   D E F E N S A   //
	// ----------------------------------------- //

	public Defensa (int dorsal) {
        super (dorsal);
    }

    public void setCubreJugador(int cubreJugador) {
        this.cubreJugador = cubreJugador;
        if (cubreJugador != Constantes.NO_CUBRIR) estaCubriendo = true;
        else estaCubriendo = false;
    }

    public int getCubreJugador() {
        return cubreJugador;
    }

    public Comando command (SituacionJugadores sj) {

        Point bola = sj.getBola();
        posicionX = (int) sj.getMisJugadores()[dorsal].getX();
        posicionY = (int) sj.getMisJugadores()[dorsal].getY();

        // si no cubrimos a ningun jugador o la bola esta a nuestro alcance vamos a por ella

        if (estaCubriendo) {

        	Point rival = sj.getContrario()[cubreJugador];

        	// se calcula la distancia existente entre la bola y el rival al que estamos cubriendo
	        // y se divide por un factor obtenido con el algoritmo genetico
	        int distancia = (int) (calcularDistancia (bola, rival) / factorProximidad) + terminoProximidad;

	        // vamos a cubrir la bola tanto si esta por delante como por detras del delantero
	        if (bola.getX() < rival.getX()) distancia *= -1;

	        // nos colocamos en linea para intentar evitar el pase al delantero
	        return new ComandoIrA(
	            dorsal,
	            rival.getX() + distancia,
	            coordenadaInterceptarY(bola, rival, distancia));
        }

        if (sj.getMasCercanoDeBola() == dorsal || (calcularDistancia(bola, sj.getMisJugadores()[dorsal]) < distanciaIrBola)) {

            return new ComandoIrA(
                    dorsal,
                    bola.getX(),
                    bola.getY());

        }

        // nos ubicamos en el area que nos pertenece
        else {

            return new ComandoIrA(
                    dorsal,
                    originalX,
                    originalY);
        }

    } // public Comando command (SituacionJugadores sj)

} // public class Defensa extends Jugador
